home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side A).zip
/
Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side A).po
/
NW.BIN.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
35KB
|
1,404 lines
***********************
* NW.BIN SOURCE CODE *
* BY ROBERT T. YUILLE *
* COPYRIGHT (C) 1988 *
* BY MICROSPARC, INC. *
* CONCORD, MA. 01742 *
* *
* THE ASSEMBLER V3.1 *
***********************
*
LN EQU $19 ; LINE NUMBER
TM EQU $1A ; TOP MARGIN
BM EQU $1B ; BOTTOM MARGIN
LM EQU $1C ; LEFT MARGIN
RM EQU $1D ; RIGHT MARGIN
NEWF EQU $1E ; NEW FILE FLAG
PRNTF EQU $E9 ; PRINTER FLAG
MMS EQU $3C ; MEM MOVE START ADDR
MME EQU $3E ; MEM MOVE END ADDR
MMD EQU $42 ; MEM MOVE DESTINATION ADDR
CML EQU $EB ; LSB OF MEMORY PTR
CMH EQU $EC ; MSB OF MEMORY PTR
CURSOR EQU $ED ; CURSOR CHARACTER
NXTCSR EQU $EE ; NEXT CURSOR CHAR
PPOS EQU $F9 ; PRINTER POSITION
YLO EQU $FA ; Y TEMP AREAS FOR
YHI EQU $FB ; WORD MOVES
EFL EQU $FC ; END OF FILE - LOW
EFH EQU $FD ; & HIGH BYTES
TMP EQU $FE ; TEMPORARY
TMP1 EQU $FF ; BUFFERS
WINDT EQU $22 ; WINDOW TOP
WINDB EQU $23 ; WINDOW BOTTOM
CH EQU $24 ; CURSOR HORIZ POSITION
CV EQU $25 ; CURSOR VERT POSITION
BASL EQU $28 ; SCREEN LINE ADDRESS
KBD EQU $C000 ; KEYBOARD KEY
STROBE EQU $C010 ; KEYBOARD STROBE
OUTNUM EQU $ED24 ; PRINT OUT NUMBER
TABV EQU $FB5B ; SET BASL
UP EQU $FC1A ; REVERSE LINE FEED
HOME EQU $FC58 ; CLEAR SCREEN
LF EQU $FC66 ; LINE FEED
CLREOL EQU $FC9C ; CLEAR TO END OF LINE
COUT EQU $FDED ; OUTPUT CHARACTER
MOVE EQU $FE2C ; MEMORY MOVE
BELL EQU $FF3A ; RING BELL
*
ORG $6600
*
***************
* START PROGRAM
***************
CLD
JMP ENTRY
FILENAME DFC 0,0
ASC "FILE: "
DFS 16
ENTRY LDA PRNTF ; CHECK PRINT FLAG
BEQ ENT1
JMP PPRINT
ENT1 JSR HOME
JSR PREP ; PREP SCREEN
JSR HOME
JSR SETCM ; SET MEMORY POINTER
LDA NEWF ; CHECK FOR TYPE
BNE ENT2 ; OF ENTRY
NEWDOC JSR NEWLN ; MAKE A NEW LINE
LDY #2
STY NEWF
DEY
STY LLN
STY FLN
JMP ENT3
ENT2 CMP #2
BEQ CURRDOC
LOADOC LDA #2
STA NEWF
JSR SAVALL
JSR FENDOC ; FIND END OF DOCUMENT
STY CRSF
INY
STY FLN ; SET FIRST LINE TO 1
LDA LN
STA LLN ; SET LAST LINE
JSR PRNTDOC1 ; PUT DOCUMENT ON SCREEN
ENT3 LDY #0
STY IMODE
STY CRSF
JMP CSR1 ; SET CURSOR
CURRDOC JSR PRNTDOC1
JMP CSR1
********************
* GET NEXT KEY PRESS
********************
NXTKEY JSR PRNTDOC ; PRINT DOCUMENT
NXTKEY1 JSR PRNTLC ; PRINT LINE & COL #'S
LDA #0 ;--
STA CRF ; 0-FLAGS
STA STOPF ;--
JSR KEYIN ; GET KEYPRESS
LDY #CMDADR-CMDCODE-1
CMDLP CMP CMDCODE,Y ;--
BEQ CMD ; CHECK FOR
DEY ; COMMANDS
BPL CMDLP ;-
CMP #$A0 ; SCREEN REST OF
BCS NXK1 ; CONTROL CHARACTERS
JMP BAD
NXK1 JMP NORMAL ; CHARACTER FOR DOCUMENT
CMD TYA ; FOUND COMMAND
ASL ; IN TABLE
TAY
LDA CMDADR,Y
STA TMP
LDA CMDADR+1,Y
STA TMP1
JMP (TMP) ; GO TO COMMAND
****************
* CHANGE CURSOR
* INSERT/REPLACE
****************
CHGCSR LDA IMODE ; TOGGLE
EOR #$80 ; IMODE
STA IMODE ; FLAG
CSR1 LDA IMODE ;--
BNE CSR2 ; SET
LDA #$FF ; CURSOR
BNE CSR3 ; CHARACTER
CSR2 LDA #$DF ;
CSR3 STA CURSOR ;--
JMP NXTKEY1
************
* ESCAPE KEY
************
ESC JSR SAVALL
JSR FENDOC ;--
JSR NXTLN ; SET END OF
LDA CML ; DOCUMENT
STA EFL ; POINTER
LDA CMH ;
STA EFH ;--
RTS
*************
* RIGHT ARROW
*************
RARR JSR CKELN ; END OF LINE?
BEQ RA1 ; YES
INC CH
JMP NXTKEY1
RA1 JSR CKLMT ; END OF DOCUMENT?
BEQ BAD ; YES
JSR CKLL0 ; LAST LINE OF DOC?
BEQ BAD ; YES
LDA #0
STA CH
RA2 JSR CKWINB ; BOTTOM OF WINDOW?
BEQ RA3 ; YES
JSR SETNXTLN ; GO TO NEXT LINE
JMP NXTKEY1
RA3 INC FLN ;--
JSR NXTLN ; SCROLL UP
JMP NXTKEY ;--
************
* LEFT ARROW
************
LARR LDY CH ; BEGINNING OF LINE?
BEQ LA1 ; YES
DEC CH
JMP NXTKEY1
LA1 JSR CKLN1 ; FIRST LINE OF DOC?
BEQ BAD ; YES
LDA #39
STA CH
LA2 JSR CKWINT ; TOP OF WINDOW?
BEQ LA3 ; YES
JSR SETPRELN ; GO TO PREVIOUS LINE
JMP NXTKEY1
LA3 DEC FLN ;--
JSR PRELN ; SCROLL DOWN
JMP NXTKEY ;--
* BAD ENTRY
BAD JSR BELL
JMP NXTKEY1
************
* DOWN ARROW
************
DNARR JSR CKLMT
BEQ BAD
JSR CKLL0
BEQ BAD
JMP RA2
**********
* UP ARROW
**********
UPARR JSR CKLN1
BEQ BAD
JMP LA2
*
CKLL0 LDY #40
LDA (CML),Y
RTS
* TAB
TAB LDA CH
CMP #35 ; 35 OR MORE?
BCS BAD ; YES
CMP #5 ; LESS THAN 5?
BCS TB2 ; NO
LDA #5
JMP TB4 ; SET TO 5
TB2 LDA #35 ;--
STA TMP ;
TBLP1 SEC ; FIND
LDA CH ; POSITION
SBC TMP ; OF CURSOR
BCS TB3 ;
SEC ;
LDA TMP ;
SBC #5 ;
STA TMP ;
JMP TBLP1 ;--
TB3 CLC ; AND SET TO
LDA TMP ; NEXT TAB
ADC #5 ; POSITION
TB4 STA CH ;--
JMP NXTKEY1
*************************************
* MOVE TO FIRST LINE OF DOC, <CTRL>-F
*************************************
FRSTLN LDA #1
STA FLN
FST1 JSR SETFLN ; SET MEM PTR TO FIRST LINE
JSR HOME
JMP NXTKEY
*********************************
* MOVE TO CENTER OF DOC, <CTRL>-C
*********************************
CNTRLN LDA LLN
LSR
STA FLN
JMP FST1
******************************
* MOVE TO END OF DOC, <CTRL>-L
******************************
LASTLN LDY LLN
DEY
STY FLN
JMP FST1
**************
* <CTRL>-Y
* CLEAR TO EOL
**************
CLEAREOL LDY CH ;--
LDA #0 ; FILL REST
CLLP STA (CML),Y ; OF MEMORY
INY ; FOR LINE
CPY #40 ; WITH ZEROS
BNE CLLP ;--
JSR SAVALL
LDA CH
BNE CLR1
JMP BLANKLN ; DELETE BLANK LINE
CLR1 JMP WRAP1 ; WRAP UP
*******************
* <CTRL>-Z - TOGGLE
* DISPLAY OF CR'S
*******************
SHOWCR LDA CRSF ; TOGGLE
EOR #$80 ; CR SHOW
STA CRSF ; FLAG
JMP NXTKEY
*****************
* CARRIAGE RETURN
*****************
RTN JSR CKLMT ; DOCUMENT FULL?
BNE CR1 ; NO
JMP BAD
CR1 JSR CHECK1 ; FURTHER CHECKS
LDY CH ; BEGINNING OF LINE?
BEQ CR2 ; YES
JSR CHECK2 ; MORE CHECKS
JSR CKELN ; END OF LINE?
BEQ CR3 ; YES
CR2 JSR CKACSR ; 0 AFTER CURSOR?
BNE CR4 ; NO
CR3 INC CRF
JMP CR8
CR4 JSR GTWRDLN1 ; GET LENGTH TO EOL
LDY #39
CRLP JSR CKCRM ;--
BNE CR5 ; CARR RTN
INC CRF ; IN WORD
CR5 DEY ; TO BE
CPY CH ; MOVED?
BNE CRLP ;--
JSR CKFDOC ; DOCUMENT FULL?
BNE CR6 ; NO
JMP BAD
CR6 JSR MBLANKLN ; MAKE A BLANK LINE
LDA IMODE ; INSERT MODE?
BNE CR7 ; NO
DEC WRDLEN ; ONE LESS CHARACTER
CR7 JSR MOVWRDN ; MOVE WORD DOWN
CR8 LDY CH ; PUT
LDA #$0D ; CR IN
STA (CML),Y ; MEMORY,
LDA #0 ; MOVE TO
STA CH ; BEG OF
JSR SETNXTLN ; NEXT LINE
LDA CRF ; CR MOVED?
BEQ CR9 ; NO
JMP NXTKEY
CR9 JSR SAVALL
JMP WRAP1 ; WRAP UP
******************
* DELETE CHARACTER
******************
DELETE JSR CKLMT
BNE DEL1
JMP BAD
DEL1 JSR CKLN1
BNE DEL2
LDY CH
BNE DEL4
JMP BAD
DEL2 JSR CKWINT
BNE DEL3
DEC FLN ; SCROLL
JSR PRNTDOC ; DOWN
JSR LF
DEL3 JSR CKWINB
BNE DEL4
INC FLN ; SCROLL
JSR PRNTDOC ; UP
JSR UP
DEL4 LDY KBD
CPY #$04 ; <CTRL>-D?
BEQ DEL6
LDY CH
BNE DEL5
JSR SETPRELN ; MOVE TO END
LDA #39 ; OF PREVIOUS
STA CH ; LINE
DELP1 JSR CKUCSR ;--
BNE DEL7 ; MOVE TO
DEC CH ; CHARACTER
JMP DELP1 ;--
DEL5 DEC CH
DEL6 JSR CKUCSR ; 0 UNDER CURSOR?
BNE DEL7 ; NO
JMP NXTKEY1
DEL7 JSR CKELN ; END OF LINE?
BEQ DEL8 ; YES
CMP #$0D ; CR UNDER CURSOR?
BNE DELP2 ; NO
DEL8 JSR STOR0M ; PUT 0 IN MEM
JSR SAVALL
LDY CH
BNE DEL9
JMP BLANKLN
DEL9 JMP WRAP1
DELP2 INY ;--
LDA (CML),Y ; MOVE REST
DEY ; OF LINE TO
STA (CML),Y ; LEFT ONE
CMP #$0D ; POSITION &
BNE DEL10 ; CHECK FOR
INC STOPF ; CR
DEL10 INY ;
CPY #39 ;
BNE DELP2 ;--
JSR STOR0M ; PUT 0 AT EOL
JSR CKLN1 ; LINE #1?
BEQ WRAP ; YES
LDY #0 ;--
DELP3 LDA (CML),Y ; GET WORD
INY ; LENGTH AT
CMP #$0D ; BEGINNING
BEQ DEL11 ; OF LINE
CMP #0 ;
BEQ DEL11 ;
CMP #$20 ;
BNE DELP3 ;
DEL11 STY WRDLEN ;--
LDA CH ; CURSOR IN
CMP WRDLEN ; FIRST WORD?
BCS WRAP ; NO
JSR PRELN ; CR IN
JSR CHKCR ; PREVIOUS LINE?
LDA CRF ;
BEQ DEL12 ; NO
LDA #0
STA CRF
JSR NXTLN ; MOVE TO NEXT LINE
JMP WRAP ; AND WRAP UP
DEL12 JSR COUNT0 ; COUNT 0'S AT EOL
JSR NXTLN
LDA LEN0 ; WILL FIRST WORD FIT
CMP WRDLEN ; AT END OF PREVIOUS LINE?
BCC WRAP ; NO
JSR SETPRELN ;--
SEC ; MOVE TO
LDA #40 ; PREVIOUS LINE,
SBC WRDLEN ;
CLC ;
ADC CH ;
STA CH ; SET CH,
LDA #0 ; RESET
STA STOPF ; FLAG,
JSR SAVALL ; AND
JMP WRAP2 ; WRAP UP
**************
* WRAP UP WORD
**************
WRAP JSR SAVALL
LDA STOPF ; STOP FLAG SET?
BNE DEND ; YES
WRAP1 JSR CKNXTLN0 ; 0 AT BEG OF NEXT LINE?
BEQ DEND ; YES
JSR CHKWRD ; ROOM FOR WORD AT
LDA STOPF ; END OF LINE?
BNE DEND ; NO
WRAP2 JSR MOVWRDUP ; MOVE WORD UP
JSR NXTLN ; FILL IN WHERE
JSR MOVLNL ; WORD MOVED
LDA CRF ; CR MOVED?
BNE BLANKLN ; YES
LDA STOPF ; CR ON LINE?
BNE DEND ; YES
JMP WRAP1 ; CONTINUE TO WRAP UP
*
BLANKLN JSR CKLLN ; LAST LINE?
BEQ DEND ; YES
JSR CKNXTLN0
BEQ BLK1
JSR SETMMD ;--
JSR SETMMS ; SET MEMORY
JSR FENDOC1 ; POINTERS AND
JSR SETMME1 ; MOVE MEMORY
JSR MOVDN ;--
BLK1 DEC LLN ; REMOVE LINE FROM END
*
DEND JSR RESALL
JMP NXTKEY
******************
* NORMAL CHARACTER
******************
NORMAL JSR CKLMT
BNE NR1
JMP BAD
NR1 JSR CKELN
BNE NR2
JSR CKFDOC
BNE NR2
JMP BAD
NR2 LDA IMODE ; INSERT MODE?
BEQ NR3 ; NO
JSR CK0ELN ; 0 AT EOL?
BEQ NR3 ; YES
JSR CKFDOC ; DOCUMENT FULL?
BNE NR3 ; NO
JMP BAD
NR3 JSR CHECK1
JSR CKUCSR ; CR UNDER
CMP #$0D ; CURSOR?
BNE NR4 ; NO
JMP INSERT
NR4 LDY CH
BEQ NR8
JSR CHECK2
LDA TMP ; CR TO LEFT OF CURSOR?
BEQ NR6 ; NO
JSR CKELN ; END OF LINE?
BNE NR5 ; NO
JSR MBLANKLN ; MAKE BLANK LINE &
JSR BNXTLN ; MOVE TO BEG OF BLANK LINE
NR5 JSR STORENT ;--
LDA #$0D ; STORE ENTRY
INY ; & CR IN
STA (CML),Y ; MEMORY
JMP NXTKEY ;--
NR6 JSR CKELN
BNE NR8
LDA IMODE
BEQ NR7
JMP INSERT1
NR7 JSR CKSPCK ; NEW CHAR A SPACE?
BNE NR10 ; NO
JSR STORENT
JSR NXTLN
JMP NXTKEY
NR8 JSR CKACSR ; 0 AFTER CURSOR?
BEQ NR9 ; YES
LDA IMODE
BEQ NR9
JMP INSERT
NR9 JSR STORENT
JMP NXTKEY1
NR10 STA (CML),Y ;--
JSR GETWRDLN ; MOVE WORD
JSR MBLANKLN ; DOWN
JSR MOVWRDN ; WITH
JSR SETNXTLN ; CURSOR
LDA WRDLEN ;
STA CH ;--
JSR SAVALL
JMP WRAP1
******************
* INSERT CHARACTER
******************
INSERT JSR SAVALL
JSR CK0ELN ; 0 AT EOL?
BNE INS1 ; NO
JSR MOVLNR1 ; MAKE ROOM FOR
JSR STORENT ; NEW CHARACTER
JMP NXTKEY
INS1 JSR GETWRDLN
JSR MBLANKLN
SEC ;--
LDA #39 ; CURSOR IN
SBC WRDLEN ; WORD TO
STA TMP ; BE MOVED?
INC TMP ;
SBC CH ;--
BCS INS5 ; NO
JSR CKSPCK ; NEW CHAR A SPACE?
BNE INS2 ; NO
JSR GTWRDLN1 ; GET REST OF WORD
JSR MOVWRDN ; MOVE IT DOWN
LDY CH
JSR STRSPCM ; STORE SPACE
JSR BNXTLN
JSR SAVALL
LDA CRF ; CR MOVED?
BNE INS3 ; YES
JMP WRAP1
INS2 JSR MOVWRDN ;--
SEC ; MOVE WORD,
LDA CH ; SET CH,
SBC TMP ;
STA CH ;
JSR SETNXTLN ; MOVE TO NEXT LINE
JSR MOVLNR1 ; MAKE ROOM
JSR STORENT ; FOR NEW CHARACTER
JSR SAVALL ;--
LDA CRF ; CR MOVED?
BEQ INS4 ; NO
INS3 JMP DEND
INS4 JMP WRAP1
INS5 JSR MOVWRDN
JSR MOVLNR1
JSR STORENT
JSR SAVALL
LDA CRF
BNE INS3
JSR SETNXTLN
JMP WRAP1
*
INSERT1 JSR CKUCSR ; 0 UNDER CURSOR?
BNE INS7 ; NO
JSR CKSPCK ; NEW CHAR A SPACE?
BNE INS6 ; NO
JSR STORENT
JSR NXTLN
JMP NXTKEY
INS6 JSR SAVALL
JMP INS1
INS7 JSR SAVALL
JSR CKSPCK
BEQ INS8
JMP INS1
INS8 JSR BNXTLN
JMP INSERT
**************
* GET KEYPRESS
**************
KEYIN LDY CURSOR ; LOAD CURSOR CHAR
STY YSAV ; SAVE IT
LDY CH ; GET CHAR UNDER
LDA (BASL),Y ; CURSOR ON SCREEN
PHA ; SAVE IT
STA NXTCSR ; SAVE FOR NEXT CURSOR
LDY YSAV ; GET BACK CURSOR CHAR
TYA ; AND
LDY CH ; PUT IT
STA (BASL),Y ; ON SCREEN
PLA
KYLP PHA
INC TMP ;--
BNE KYN1 ; TIMING
LDA TMP1 ; FOR
INC TMP1 ; CURSOR
EOR TMP1 ; BLINK
AND #$40 ;
BEQ KYN1 ;--
LDY CH ;--
LDA (BASL),Y ; SWITCH
LDY NXTCSR ; CURSOR CHARACTER
STA NXTCSR ; AND
TYA ; CHARACTER
LDY CH ; ON SCREEN
STA (BASL),Y ;--
KYN1 PLA
BIT KBD ; KEY PRESSED?
BPL KYLP ; NO
LDY CH ; RESTORE ORIGINAL
STA (BASL),Y ; SCREEN CHARACTER
LDA KBD ; GET KEYPRESS AND
STA STROBE ; CLEAR KBD HIGH BIT
RTS
****************
* PREPARE SCREEN
****************
PREP LDA #FILENAME ;--
LDX #FILENAME/ ; PRINT
JSR MESSAGE ; FILENAME
LDA #ESCMSG ; AND ESCAPE
LDX #ESCMSG/ ; MESSAGE
JSR MESSAGE ;--
LDA #1
JSR TABV
LDY #0 ;--
LDA #$AD ; "-"
PELP1 STA (BASL),Y
INY
CPY #5
BNE PELP1
PELP2 LDA #$BA ; ":"
STA (BASL),Y
INY
LDX #0
PELP3 LDA #$AD ; PRINT TOP
STA (BASL),Y ; AND BOTTOM
INY ; LINES
INX
CPX #4
BNE PELP3
CPY #40
BNE PELP2
LDY #0
LDA #22
JSR TABV
LDA #$AD
PELP4 STA (BASL),Y
INY
CPY #40
BNE PELP4 ;--
LDA #2 ;--
STA WINDT ; SET
LDA #22 ; WINDOWS
STA WINDB ;--
RTS
*************************
* PRINT MESSAGE TO SCREEN
*************************
MESSAGE STA TMP
STX TMP1
LDY #0
LDA (TMP),Y
STA CH
INY
LDA (TMP),Y
JSR TABV
MGLP INY
LDA (TMP),Y
BEQ MSG1
JSR COUT
BNE MGLP
MSG1 JSR CLREOL
RTS
*****************************
* SET MEMORY POINTER TO $7000
*****************************
SETCM LDA #0
STA CML
LDA #$70
STA CMH
LDA #1
STA LN
RTS
****************
* SAVE VARIABLES
****************
SAVALL JSR SAVCSR
LDA CML
STA PTRSAV
LDA CMH
STA PTRSAV+1
LDA LN
STA LNSAV
RTS
*******************
* RESTORE VARIABLES
*******************
RESALL JSR RESCSR
LDA PTRSAV
STA CML
LDA PTRSAV+1
STA CMH
LDA LNSAV
STA LN
RTS
**********************
* SAVE CURSOR SETTINGS
**********************
SAVCSR LDA CH
STA CHSAV
LDA CV
STA CVSAV
RTS
*************************
* RESTORE CURSOR SETTINGS
*************************
RESCSR LDA CHSAV
STA CH
LDA CVSAV
JSR TABV
RTS
**********************************
* MOVE MEMORY POINTER TO NEXT LINE
**********************************
NXTLN CLC
LDA CML
ADC #40
BCC NXT1
INC CMH
NXT1 STA CML
INC LN
RTS
**************************************
* MOVE MEMORY POINTER TO PREVIOUS LINE
**************************************
PRELN SEC
LDA CML
SBC #40
BCS PRE1
DEC CMH
PRE1 STA CML
DEC LN
RTS
***************************
* SET MEM & CV TO NEXT LINE
***************************
SETNXTLN JSR LF
JSR NXTLN
RTS
*******************************
* SET MEM & CV TO PREVIOUS LINE
*******************************
SETPRELN JSR UP
JSR PRELN
RTS
******************************
* GO TO BEGINNING OF NEXT LINE
******************************
BNXTLN LDA #0
STA CH
JSR SETNXTLN
RTS
*****************
* SET LINE TO FLN
*****************
SETFLN JSR SETCM
STLP LDA LN
CMP FLN
BEQ SFN1
JSR NXTLN
JMP STLP
SFN1 RTS
***************
* MAKE NEW LINE
***************
NEWLN LDA #0
LDY #40
NWLP STA (CML),Y
DEY
BPL NWLP
INC LLN
RTS
**********************
* FIND END OF DOCUMENT
**********************
FENDOC JSR SETCM
FENDOC1 LDY #0
FELP LDA (CML),Y
BEQ FED1
JSR NXTLN
JMP FELP
FED1 RTS
********************
* SET MEM MOVE START
********************
SETMMS JSR NXTLN
LDA CML
STA MMS
LDA CMH
STA MMS+1
RTS
******************
* SET MEM MOVE END
******************
SETMME JSR FENDOC
SETMME1 JSR NXTLN
LDA CML
STA MME
LDA CMH
STA MME+1
RTS
**************************
* SET MEM MOVE DESTINATION
**************************
SETMMD LDA CML
STA MMD
LDA CMH
STA MMD+1
RTS
***************
* MOVE MEM DOWN
***************
MOVDN LDY #0
JSR MOVE
RTS
*************
* MOVE MEM UP
*************
MOVUP LDY #0
MMLP LDA (MME),Y
STA (MMD),Y
LDA MMS ;--
CMP MME ; REACHED START
LDA MMS+1 ; OF MEMORY
SBC MME+1 ; FOR MOVE?
BCS MVP3 ; YES
LDA MMD
BNE MVP1
DEC MMD+1
MVP1 DEC MMD
LDA MME
BNE MVP2
DEC MME+1
MVP2 DEC MME
JMP MMLP
MVP3 RTS
***********
* CHECKS #1
***********
CHECK1 JSR CKLLN ; LAST LINE?
BNE CK11 ; NO
JSR NXTLN
JSR NEWLN
JSR PRELN
CK11 JSR CKWINB
BNE CK12
INC FLN ; SCROLL
JSR PRNTDOC ; UP
JSR UP
CK12 RTS
***********
* CHECKS #2
***********
CHECK2 LDA #0
STA TMP
JSR CKBCSR ; 0 BEFORE CURSOR?
BEQ CK21 ; YES
CMP #$0D ; CR BEFORE CURSOR?
BNE CK24 ; NO
JMP CK23
CK21 LDY CH
CKLP DEY ;--
LDA (CML),Y ; SWITCH
BNE CK22 ; SPACES
JSR STRSPCM ; FOR 0'S
CPY #0 ; BEFORE
BEQ CK24 ; CURSOR
JMP CKLP ;--
CK22 CMP #$0D ; CR BEFORE CURSOR?
BNE CK24 ; NO
CK23 INC TMP
JSR STRSPCM ; STORE SPACE IN MEM
CK24 RTS
*************
* STORE ENTRY
*************
STORENT LDA KBD
LDY CH
STA (CML),Y
ORA #$80
JSR COUT
RTS
********************
* STORE SPACE IN MEM
********************
STRSPCM LDA #$20
STA (CML),Y
RTS
*******************
* STORE ZERO IN MEM
*******************
STOR0M LDA #0
STA (CML),Y
RTS
***************************
* PRINT CHARACTER TO SCREEN
***************************
PRCHAR LDA (CML),Y
BEQ PRC1
CMP #$0D
BNE PRC2
LDA CRSF
BEQ PRC1
LDA #$2A ; INVERSE ASTERISK
JMP PRC3
PRC1 LDA #$20
PRC2 ORA #$80
PRC3 STA (BASL),Y
RTS
****************************
* PRINT 20 LINES OF DOCUMENT
****************************
PRNTDOC JSR SAVALL
PRNTDOC1 JSR SETFLN
LDA #2
JSR TABV
PDLP1 LDY #39 ;--
PDLP2 JSR PRCHAR ; PRINT
DEY ; ONE
BPL PDLP2 ; LINE
LDA LN
CMP LLN ; LAST LINE?
BEQ PD1 ; YES
LDA CV
CMP #21 ; OR BOTTOM OF WINDOW?
BEQ PD1 ; YES
JSR SETNXTLN ; MOVE TO NEXT LINE
JMP PDLP1 ; AND PRINT IT
PD1 JSR RESALL
RTS
**********************
* PRINT LINE & COL #'S
**********************
PRNTLC JSR SAVCSR
LDA #MSGLC ; PRINT
LDX #MSGLC/ ; LINE/COLUMN
JSR MESSAGE ; MESSAGE
LDA #5 ;
STA CH ; PRINT NEW
LDA #0 ; LINE NUMBER
LDX LN ; MSB-ACC
JSR OUTNUM ; LSB-X
LDA #17 ;--
STA CH ; PRINT NEW
LDA #0 ; COLUMN
LDX CHSAV ; NUMBER
INX ;
JSR OUTNUM ;--
JSR RESCSR
RTS
************************
* VARIOUS CHECKS & TESTS
************************
CKELN LDY CH
CPY #39
RTS
*
CK0BLN LDY #0
LDA (CML),Y
RTS
*
CK0ELN LDY #39
LDA (CML),Y
RTS
*
CKBCSR LDY CH
DEY
LDA (CML),Y
RTS
*
CKUCSR LDY CH
LDA (CML),Y
RTS
*
CKACSR LDY CH
INY
LDA (CML),Y
RTS
*
CKNXTLN0 LDY #40
LDA (CML),Y
RTS
*
CKLN1 LDA LN
CMP #1
RTS
*
CKFLN LDA LN
CMP FLN
RTS
*
CKLLN LDA LN
CMP LLN
RTS
*
CKLMT LDA LN
CMP #241
RTS
*
CKFDOC LDA LLN
CMP #241
RTS
*
CKWINT LDA CV
CMP #2
RTS
*
CKWINB LDA CV
CMP #21
RTS
*
CKSPCK LDA KBD
CMP #$20
RTS
*
CKSPCM LDA (CML),Y
CMP #$20
RTS
*
CKCRM LDA (CML),Y
CMP #$0D
RTS
*****************************
* GET WORD LENGTH FOR WRAP UP
*****************************
CHKWRD JSR COUNT0
JSR NXTLN
LDY #0 ;--
LDX #0 ;
LDA (CML),Y ;
CMP #$20 ; GET LENGTH
BEQ CKW1 ;
CMP #$0D ; OF FIRST
BEQ CKW1 ;
CWLP1 INY ; WORD
LDA (CML),Y ;
BEQ CKW1 ; ON LINE
CMP #$0D ;
BEQ CKW1 ;
CMP #$20 ;
BNE CWLP1 ;
CKW1 INY ;
STY WRDLEN ;--
SEC ; COMPARE TO
CPY LEN0 ; LENGTH OF 0'S
BEQ CKW2 ; EQUAL
INX
DEY
BCC CWLP1 ; SHORTER
CPX #1 ; FIRST WORD?
BNE CWLP2 ; NO
INC STOPF
BNE CKW2
CWLP2 DEY ;--
JSR CKSPCM ; STRIP OFF
BNE CWLP2 ; A WORD
INY ;
STY WRDLEN ;--
CKW2 JSR PRELN
RTS
***********************************
* GET LENGTH OF WORD AT END OF LINE
***********************************
GETWRDLN LDX #0
JSR CK0ELN
CMP #$0D ; CHECK FOR
BNE GWLP1 ; CR IN
INC CRF ; WORD
GWLP1 CPY #0
BEQ GTW1
DEY
INX
JSR CKSPCM
BNE GWLP1
STX WRDLEN
RTS
GTW1 LDA #1
STA WRDLEN
RTS
********************************
* GET LENGTH FROM CH TO END LINE
********************************
GTWRDLN1 SEC
LDA #40
SBC CH
STA WRDLEN
RTS
**************
* MOVE WORD UP
**************
MOVWRDUP SEC
LDA #40
STA YHI
SBC LEN0
STA YLO
LDX WRDLEN
MULP LDY YHI
LDA (CML),Y
LDY YLO
STA (CML),Y
INC YLO
INC YHI
DEX
BNE MULP
RTS
****************
* MOVE WORD DOWN
****************
MOVWRDN SEC
LDA #40
STA YHI
SBC WRDLEN
STA YLO
MDLP1 LDY YLO
LDA (CML),Y
BEQ MWD1
LDY YHI
STA (CML),Y
INC YHI
LDY YLO
JSR STOR0M
INY
STY YLO
CPY #40
BNE MDLP1
MWD1 RTS
*******************
* MOVE LINE TO LEFT
*******************
MOVLNL LDY WRDLEN
STY YHI
LDY #0
STY YLO
LDY YHI
LDA (CML),Y
BNE MLLP1
INC CRF ; IF CR IN WORD MOVED
MLLP1 LDY YHI
LDA (CML),Y
LDY YLO
STA (CML),Y
CMP #$0D ; CHECK FOR
BNE MLL1 ; CR IN
INC STOPF ; LINE
MLL1 INC YLO
INC YHI
LDY YHI
CPY #40
BNE MLLP1
LDY YLO
MLLP2 JSR STOR0M ; FILL REST
INY ; OF LINE
CPY #40 ; WITH 0'S
BNE MLLP2
RTS
*******************
* MOVE LINE RIGHT 1
*******************
MOVLNR1 LDY #39
MRLP DEY
LDA (CML),Y
INY
STA (CML),Y
DEY
CPY CH
BNE MRLP
RTS
*******************
* MAKE A BLANK LINE
*******************
MBLANKLN JSR SAVALL
JSR SETMMS ;--
JSR SETMME ; SET MEMORY
JSR NXTLN ; POINTERS AND
JSR SETMMD ; MOVE MEMORY
JSR MOVUP ;--
JSR RESALL
JSR NXTLN ; FILL NEW LINE
JSR LINE0 ; WITH 0'S
INC LLN
JSR RESALL
RTS
**********************
* CHECK FOR CR ON LINE
**********************
CHKCR LDY #0
CKRLP JSR CKCRM
BNE CKR1
INC CRF
CKR1 INY
CPY #40
BNE CKRLP
RTS
**********************************
* GET LENGTH OF 0'S AT END OF LINE
**********************************
COUNT0 LDY #40
LDX #$FF
CTLP DEY
INX
LDA (CML),Y
BEQ CTLP
STX LEN0
RTS
********************
* FILL LINE WITH 0'S
********************
LINE0 LDY #39
L0LP JSR STOR0M
DEY
BPL L0LP
RTS
***************************
* PRINT DOCUMENT TO PRINTER
***************************
PPRINT JSR SETCM
LDA #0
STA STOPF
JSR PAUSE
LDA STOPF
BEQ PPR1
JMP PRTN1
PPR1 JSR PRNTLM
LDY #0
STY CRF
STY PPOS
DEY
LDA STROBE
NXTWRD LDA KBD ;--
BPL PPR2 ; ESCAPE KEY
CMP #$9B ; PRESSED?
BNE PPR2 ;--
JMP PRTN ; YES
PPR2 LDA STROBE
LDX #0
PPLP1 INX
PPLP2 INY
CPY #40 ; END OF LINE?
BNE PPR3 ; NO
LDA (CML),Y ; END OF DOCUMENT?
BEQ PRTN ; YES
JSR NXTLN ; MOVE MEM PTR
DEC LN ; RESET LINE
LDY #0 ; RESET Y
PPR3 LDA (CML),Y
BEQ PPLP2 ; IF 0, MOVE ON
INC PPOS
LDA PPOS
CMP RM ; RIGHT MARGIN?
BNE PPR4 ; NO
INC CRF ; SET CR FLAG
PPR4 LDA (CML),Y
CMP #$0D ; CHARACTER CR?
BEQ PPR5 ; YES
CMP #$20 ; CHAR SPACE?
BNE PPLP1 ; NO
PPR5 STX WRDLEN
LDA CRF ; CR FLAG SET?
BEQ PWRD ; NO
STY YSAV1
LDA #$0D
JSR PGEND
LDA STOPF
BNE PRTN1
JSR PRNTLM ; PRINT LEFT MARGIN
LDY #0
STY CRF ; RESET CR FLAG
LDY WRDLEN ; WRDLEN
STY PPOS ; & PPOS
LDY YSAV1 ; RESTORE Y
PWRD LDX #0
INY
SEC ; RESET Y TO
TYA ;
SBC WRDLEN ; START OF WORD
TAY
DEY
PPLP3 INX
INY
LDA (CML),Y
STY YSAV1
CMP #$0D ; CR?
BNE PPR6 ; NO
JSR PGEND
LDA STOPF
BNE PRTN1
JSR PRNTLM
LDY #0
STY PPOS ; RESET PPOS
JMP PPR7
PPR6 ORA #$80 ; PRINT CHARACTER
JSR COUT
PPR7 LDY YSAV1 ; RESTORE Y
CPX WRDLEN ; END OF WORD?
BNE PPLP3 ; NO
JMP NXTWRD ; GET NEXT WORD
PRTN LDA #$8C ; FORM FEED
JSR COUT
PRTN1 RTS
* END OF PAGE?
PGEND ORA #$80 ; PRINT CR
JSR COUT
INC LN
LDA LN
CMP BM ; BOTTOM MARGIN?
BNE PGD1 ; NO
LDA #$0C
JSR COUT
LDA #0
STA LN
JSR PAUSE
PGD1 RTS
****************
* SET TOP MARGIN
****************
SETTM LDA #$8D ; CR
JSR COUT
INC LN
LDA LN
CMP TM
BCC SETTM
RTS
*********************
* PAUSE TO LOAD PAPER
*********************
PAUSE LDA #30
STA CH
LDA #9
JSR TABV
PAUSE1 JSR KEYIN
CMP #$9B
BNE PSE1
INC STOPF
RTS
PSE1 CMP #$A0
BNE PAUSE1
JSR SETTM
RTS
*******************
* PRINT LEFT MARGIN
*******************
PRNTLM LDA #$A0
LDY LM
LMLP JSR COUT
DEY
BNE LMLP
RTS
***************************
* COMMAND CODES & ADDRESSES
***************************
CMDCODE DFC $85,$9B,$95,$88,$8A,$8B,$89
DFC $86,$83,$8C,$99,$9A,$8D,$84,$FF
CMDADR DFC CHGCSR,CHGCSR/
DFC ESC,ESC/
DFC RARR,RARR/
DFC LARR,LARR/
DFC DNARR,DNARR/
DFC UPARR,UPARR/
DFC TAB,TAB/
DFC FRSTLN,FRSTLN/
DFC CNTRLN,CNTRLN/
DFC LASTLN,LASTLN/
DFC CLEAREOL,CLEAREOL/
DFC SHOWCR,SHOWCR/
DFC RTN,RTN/
DFC DELETE,DELETE/
DFC DELETE,DELETE/
***************************
* VARIOUS FLAGS & REGISTERS
***************************
IMODE DFC 0
CRF DFC 0
CRSF DFC 0
STOPF DFC 0
LEN0 DFC 0
WRDLEN DFC 0
FLN DFC 1
LLN DFC 1
CHSAV DFC 0
CVSAV DFC 0
LNSAV DFC 0
YSAV DFC 0
YSAV1 DFC 0
PTRSAV DFS 2
****************
* ESCAPE MESSAGE
****************
ESCMSG DFC 22,0
ASC "ESCAPE: MAIN MENU"
DFC 0
*********************
* LINE/COLUMN MESSAGE
*********************
MSGLC DFC 0,23
ASC "LINE COLUMN"
DFC 0